home *** CD-ROM | disk | FTP | other *** search
- #!/usr/bin/perl
- #
- # Prints info on all smb responding machines on a subnet.
- # This script needs to be run on a machine without nmbd running and be
- # run as root to get correct info from WIN95 clients.
- #
- # syntax:
- # findsmb [-d|-D] [-r] [subnet broadcast address]
- #
- # with no agrument it will list machines on the current subnet
- #
- # There will be a "+" in front of the workgroup name for machines that are
- # local master browsers for that workgroup. There will be an "*" in front
- # of the workgroup name for machines that are the domain master browser for
- # that workgroup.
- #
- # Options:
- #
- # -d|-D enable debug
- # -r add -r option to nmblookup when finding netbios name
- #
-
- $SAMBABIN = "/usr/bin";
-
- for ($i = 0; $i < 2; $i++) { # test for -d and -r options
- $_ = shift;
- if (m/-d|-D/) {
- $DEBUG = 1;
- } elsif (m/-r/) {
- $R_OPTION = "-r";
- }
- }
-
- if ($_) { # set broadcast address if it was specified
- $BCAST = "-B $_";
- }
-
-
- ######################################################################
- # do numeric sort on last field of IP address
- sub ipsort
- {
- @t1 = split(/\./,$a);
- @t2 = split(/\./,$b);
- @t1[3] <=> @t2[3];
- }
- ######################################################################
-
- # look for all machines that respond to a name lookup
-
- open(NMBLOOKUP,"$SAMBABIN/nmblookup $BCAST '*' --debuglevel=0|") ||
- die("Can't run nmblookup '*'.\n");
-
- # get rid of all lines that are not a response IP address,
- # strip everything but IP address and sort by last field in address
-
- @ipaddrs = sort ipsort grep(s/ \*<00>.*$//,<NMBLOOKUP>);
-
- # print header info
- print "\n *=DMB\n";
- print " +=LMB\n";
- print "IP ADDR NETBIOS NAME WORKGROUP/OS/VERSION $BCAST\n";
- print "---------------------------------------------------------------------\n";
-
- foreach $ip (@ipaddrs) # loop through each IP address found
- {
- $ip =~ s/\n//; # strip newline from IP address
-
- # find the netbios names registered by each machine
-
- open(NMBLOOKUP,"$SAMBABIN/nmblookup $R_OPTION -A $ip --debuglevel=0|") ||
- die("Can't get nmb name list.\n");
- @nmblookup = <NMBLOOKUP>;
- close NMBLOOKUP;
-
- # get the first <00> name
-
- @name = grep(/<00>/,@nmblookup);
- $_ = @name[0];
-
- if ($_) { # we have a netbios name
- if (/GROUP/) { # is it a group name
- ($name, $aliases, $type, $length, @addresses) =
- gethostbyaddr(pack('C4',split('\.',$ip)),2);
- if (! $name) { # could not get name
- $name = "unknown nis name";
- }
- } else {
- # The Netbios name can contain lot of characters also '<' '>'
- # and spaces. The follwing cure inside name space but not
- # names starting or ending with spaces
- /(.{1,15})\s+<00>\s+/;
- $name = $1;
- $name =~ s/^\s+//g;
- }
-
- # do an smbclient command on the netbios name.
-
- if ( "$name" ) {
- open(SMB,"$SAMBABIN/smbclient -L $name -I $ip -N --debuglevel=1 2>&1 |") ||
- die("Can't do smbclient command.\n");
- @smb = <SMB>;
- close SMB;
-
- if ($DEBUG) { # if -d flag print results of nmblookup and smbclient
- print "===============================================================\n";
- print @nmblookup;
- print @smb;
- }
-
- # look for the OS= string
-
- @info = grep(/OS=/,@smb);
- $_ = @info[0];
- if ($_) { # we found response
- s/Domain=|OS=|Server=|\n//g; # strip out descriptions to make line shorter
-
- } else { # no OS= string in response (WIN95 client)
-
- # for WIN95 clients get workgroup name from nmblookup response
- @name = grep(/<00> - <GROUP>/,@nmblookup);
- $_ = @name[0];
- if ($_) {
- # Same as before for space and characters
- /(.{1,15})\s+<00>\s+/;
- $_ = "[$1]";
- } else {
- $_ = "Unknown Workgroup";
- }
- }
- }
-
- # see if machine registered a local master browser name
- if (grep(/<1d>/,@nmblookup)) {
- $master = '+'; # indicate local master browser
- if (grep(/<1b>/,@nmblookup)) { # how about domain master browser?
- $master = '*'; # indicate domain master browser
- }
- } else {
- $master = ' '; # not a browse master
- }
-
- # line up info in 3 columns
-
- print "$ip".' 'x(16-length($ip))."$name".' 'x(14-length($name))."$master"."$_\n";
-
- } else { # no netbios name found
- # try getting the host name
- ($name, $aliases, $type, $length, @addresses) =
- gethostbyaddr(pack('C4',split('\.',$ip)),2);
- if (! $name) { # could not get name
- $name = "unknown nis name";
- }
- if ($DEBUG) { # if -d flag print results of nmblookup
- print "===============================================================\n";
- print @nmblookup;
- }
- print "$ip".' 'x(16-length($ip))."$name\n";
- }
- }
-
-